package fr.cdesire.sudoku.core.commons;


/**
 * Représente une position de case déterminée par un numéro de ligne, un numéro de colonne
 * et un numéro de région. Pour information, le numéro de région dépend fortement
 * du format de la grille.
 * @author cedric.desire@gmail.com
 */
public class Position {

    /**
     * Numéro de la ligne.
     */
    private final int ligne;
    /**
     * Numéro de la colonne.
     */
    private final int colonne;
    /**
     * Numéro de la région
     */
    private final int region;

    /**
     * Constructeur privé : c'est lors de la création du format de la grille qu'est
     * déterminé l'ensemble des positions des cases.
     * @param ligne Numéro de la ligne.
     * @param colonne Numéro de la colonne.
     * @param region Numéro de la région.
     */
    protected Position(final int ligne, final int colonne, final int region) {
        this.ligne = ligne;
        this.colonne = colonne;
        this.region = region;
    }

    /**
     * Retourne le numéro de la ligne.
     * @return Numéro de la ligne.
     */
    public int getLigne() {
        return ligne;
    }

    /**
     * Retourne le numéro de la colonne.
     * @return Numéro de la colonne.
     */
    public int getColonne() {
        return colonne;
    }

    /**
     * Retourne le numéro de la région.
     * @return Numéro de la région.
     */
    public int getRegion() {
        return region;
    }

    /**
     * Redéfinit l'égalité entre 2 positions en fonction des numéros de ligne, de
     * colonne et de région.
     * @param obj Position.
     * @return Vrai ou faux.
     */
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Position other = (Position) obj;
        if (this.ligne != other.ligne) {
            return false;
        }
        if (this.colonne != other.colonne) {
            return false;
        }
        if (this.region != other.region) {
            return false;
        }
        return true;
    }
    
    /**
     * Redéfinit le hashcode en fonction des numéros de ligne, de colonne et de
     * région.
     * @return Hashcode.
     */
    @Override
    public int hashCode() {
        int hash = 3;
        hash = 29 * hash + this.ligne;
        hash = 29 * hash + this.colonne;
        hash = 29 * hash + this.region;
        return hash;
    }
}
